From: Keir Fraser Date: Thu, 25 Feb 2010 20:56:43 +0000 (+0000) Subject: ACPI: workaround for S3 fail in two facs tables case X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~12561 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=515a6e93aa21be184141ed4c3a8e4f2352ecc7d2;p=xen.git ACPI: workaround for S3 fail in two facs tables case Some legacy BIOS which support ACPI2.0+ may expose two FACS tables via both FADT->FIRMWARE_CTRL and FADT->X_FIRMWARE_CTRL, but only lookup S3 waking_vector in the first one. Signed-off-by: Wei Gang Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/acpi/boot.c b/xen/arch/x86/acpi/boot.c index 8e67cde539..5a1dda0ee6 100644 --- a/xen/arch/x86/acpi/boot.c +++ b/xen/arch/x86/acpi/boot.c @@ -365,10 +365,15 @@ acpi_fadt_parse_sleep_info(struct acpi_table_fadt *fadt) acpi_sinfo.pm1b_evt_blk.address); /* Now FACS... */ - if (fadt->header.revision >= FADT2_REVISION_ID) - facs_pa = fadt->Xfacs; - else + facs_pa = ((fadt->header.revision >= FADT2_REVISION_ID) + ? fadt->Xfacs : (uint64_t)fadt->facs); + if (fadt->facs && ((uint64_t)fadt->facs != facs_pa)) { + printk(KERN_WARNING PREFIX + "32/64X FACS address mismatch in FADT - " + "%08x/%016"PRIx64", using 32", + fadt->facs, facs_pa); facs_pa = (uint64_t)fadt->facs; + } facs = (struct acpi_table_facs *) __acpi_map_table(facs_pa, sizeof(struct acpi_table_facs));